package com.foreknow.test;

import java.awt.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * Java中的反射:他是Java中非常重要的一个概念,它具有动态机制
 * 特点:
 * 1.在程序运行时会判断任意一对象所属的类
 * 2.程序在运行的时候可以动态获取类的对象
 * 3.程序在运行的时候可以动态获取类中的方法以及属性
 *
 * Java中反射的常见写法
 * 1. Class clazz = 类名.class
 * 2. Class clazz = class.forName("com.mysql.jdbc.Driver");
 * 3. this.getClass();
 */
public class ReflectDemo {

    public void getMethodTest() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.获取当前的类对象
        Class cls = Class.forName("com.foreknow.test.ReflectDemo");
        //2.调用class中的getMethod方法来获取方法的名称以及参数
        //Method getMethod(String name, Class<?>... parameterTypes)
        // 返回一个 Method 对象，它反映此 Class 对象所表示的类或接口的指定公共成员方法。
        //name - 方法名
        //parameterTypes - 参数列表
        Class[] classes = new Class[2];
        classes[0] =Class.forName("java.lang.String");
        classes[1] = Class.forName("java.util.HashMap");

        //----------------------
        Method method = cls.getMethod("testMethod",classes);//获取方法名,以及参数列表



        //3.调用testMethod这个方法
        Object[] args = new Object[2];//调用方法传递的实际参数
        args[0] = "hello tony";
        Map<String,String> ht = new HashMap();
        ht.put("name","this is a map");
        args[1] = ht;

        //-----------------------第一个参数在哪个对象中,new一个对象
        String str = (String) method.invoke(new ReflectDemo(),args);
        System.out.println(str);
    }
     public String testMethod(String str, HashMap ht){
        String returnStr = "this is return value";
         System.out.println("/222testMethod method");
         System.out.println("/333str="+str);
         System.out.println("/444name"+ht.get("name"));
        return returnStr;
     }


    public void getNameTest() throws ClassNotFoundException {
        String name = "测试反射";
        Class cls = name.getClass();
        System.out.println("class name is"+cls.getName());

        Button btn = new Button();
        Class btnclass = btn.getClass();
        System.out.println("super class name is:"+btnclass.getSuperclass());

        Class q1 = Class.forName("java.awt.Button");
        System.out.println("q1 is:"+q1);
    }

    public static void main(String[] args) {
        ReflectDemo reflectDemo = new ReflectDemo();
        try {
            reflectDemo.getMethodTest();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        try {
            reflectDemo.getNameTest();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        ;
    }
}
